---
title: "Desempeño en ventas"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
source_code: embed
---
```{r setup, include=FALSE}
library(flexdashboard)
library(readr)
library(lubridate)
library(dplyr)
library(DT)
library(scales)
library(plotly)
library(leaflet)
library(crosstalk)
library(htmltools)
```
```{r message=FALSE, warning=FALSE, include=FALSE}
mi_tienda <- read.csv('tienda.csv',stringsAsFactors = FALSE) %>%
rename_with( ~ tolower(gsub(".","_",.x,fixed = TRUE)))
mi_tienda$sales <- sub(",","",mi_tienda$sales)
mi_tienda$profit <- sub(",","",mi_tienda$profit)
mi_tienda[,c("order_date","ship_date","sales","profit","year","cost")] <- as.data.frame(list(order_date = mdy(mi_tienda$order_date),
ship_date = mdy(mi_tienda$ship_date),
sales = as.numeric(mi_tienda$sales),
profit = mutate(data.frame(profit = as.numeric(mi_tienda$profit)),
profit=ifelse(is.na(profit),0,profit)),
year = year(mdy(mi_tienda$order_date))
))%>%
mutate(cost = sales-profit)
```
```{r}
## DataShared para definir los productos más rentables
data_top <- SharedData$new(mi_tienda %>%
group_by(year, sub_category,product_name) %>%
dplyr::summarise(profit = sum(profit)/sum(cost),
ventas = sum(sales),
costos = sum(cost),
segmentos = segment,
state = state)%>%
arrange(desc(profit)))
```
# Productos
Outputs2
---
### Ventas
```{r fig.width=10, fig.height=1}
metricas <- mi_tienda%>%
summarise(tsales = sum(sales),
tcost = sum(cost),
tprof = sum(profit))
valueBox(scales::dollar(metricas$tsales),
icon = "fa-coins",
color = ifelse(metricas$tsales < metricas$tcost, '#E3242B', '#74B72E'),
caption = "Venta total")
```
### Costos
```{r fig.width=10, , fig.height=1}
valueBox(scales::dollar(metricas$tcost),
icon = "fa-receipt",
color = ifelse(metricas$tcost > metricas$tsales, '#E3242B', '#E3242B'),
caption = "Costo total")
```
### Ganancias
```{r fig.width=10, , fig.height=1}
valueBox(scales::dollar(metricas$tprof),
icon = "fa-medal",
color = ifelse(metricas$tprof < 0, '#E3242B', '#1BBC9B'),
caption = "Ganancia total")
```
### Rendimiento total
```{r fig.width=10, , fig.height=1}
profit <- round(metricas$tprof/metricas$tcost,2)*100
gauge(profit,min=0,max=100, symbol = '%',
gaugeSectors(success=c(80,100),
warning = c(30,79),
danger = c(0,29)
))
```
Filtros {data-width = 1}
---
### Filtros
```{r fig.width = 7}
# Aplicación de filtro de año
filter_select("dt","Year",data_top,group = ~year, multiple = FALSE)
# Aplicación de filtro de subcategoría
filter_select("ctr","Sub_category", data_top, group = ~sub_category, multiple = FALSE)
# Aplicación de filtro de Estado
filter_select("ste","State", data_top, group = ~state, multiple = FALSE)
```
Outputs {data-width = 950}
---
### Rendimiento por producto
```{r echo=FALSE, fig.width=20}
## Mostrar las tablas
data_top %>%
DT::datatable(rownames = FALSE,
filter = "none",
colnames = c('Year','Subcategoria','Nombre del producto','Rendimiento'),
options = list(dom = 't',
columnDefs = list(list(targets = "year",visible = FALSE),
list(targets = "sub_category", visible = FALSE),
list(targets = "ventas", visible = FALSE),
list(targets = "segmentos", visible = FALSE),
list(targets = "costos", visible = FALSE)),
pageLength = 5,
initComplete = JS("function(settings, json) {",
"$(this.api().table().header()).css({'background-color': '#F8DD74', 'color': '#000'});",
"}")))%>%
formatPercentage('profit',digits = 2) %>%
formatStyle('profit', backgroundColor = '#FAFCAF', fontWeight = 'bold')%>%
formatStyle('product_name', color = 'gray', fontWeight = 'bold')
```
### Análisis de segmentos
```{r fig.width=20}
#### Gráfico de segmentos ####
plot_ly(data_top,x=~segmentos,y=~ventas,color = "#99CCFF", type = "bar", barmode = 'stack',name = "Ventas",marker=list(line=list(color='#0', width=-4)))%>%
add_trace(y = ~costos, color = "#F4A384", name = "Costos",marker=list(line=list(color='#0', width=-4)),barmode = 'stack')%>%
add_trace(y = ~ventas-costos, color = "#B5EAD7", name = "Ganancia",marker=list(line=list(color='#0', width=-4)),barmode = 'stack')%>%
layout(xaxis = list(title = ""),
yaxis = list(title = 'US$',
titlefont = list(size = 12,color = 'gray')),
legend = list(x = 0.90, y = 1),
barmode = 'group', bargroupgap = 0.1)
```
# Entregas
Filtros {.sidebar}
---
### Filtros
```{r}
mapear <- SharedData$new(merge(mi_tienda,read.csv('lanlong.csv',stringsAsFactors = FALSE),
by.x = "state", by.y = "state.name")%>%
group_by(year,state,state.longitude,state.latitude,ship_mode)%>%
dplyr::summarise(sales = sum(sales),
profit = sum(profit),
cost = sum(cost)))
# Aplicación de filtro de año
filter_select("dt","Year",mapear,group = ~year, multiple = FALSE)
# Aplicación de filtro del modo de entrega
filter_select("shp","Ship_mode", mapear, group = ~ship_mode, multiple = FALSE)
```
Output
---
### Ventas
```{r}
leaflet(mapear) %>%
addTiles() %>%
setView(-97.0000000, 38.0000000, zoom = 4)%>%
addCircles(lat = ~state.latitude, lng = ~state.longitude,
weight=1, radius = ~sqrt(sales)*2000, color= "#74B72E",
group = "sales", popup = ~htmlEscape(sales),
popupOptions = popupOptions(maxWidth ="100%", closeOnClick = TRUE))
#addCircles(lat = ~state.latitude, lng = ~state.longitude,
#weight=1, radius = ~sqrt(profit)*2000, color= "#F6BE00",group = "profit")%>%
#addLayersControl(overlayGroups = c("sales","profit"),
#options = layersControlOptions(collapsed = T), position="topleft")
```
### Utilidad
```{r}
leaflet(mapear) %>%
addTiles() %>%
setView(-97.0000000, 38.0000000, zoom = 4)%>%
addCircles(lat = ~state.latitude, lng = ~state.longitude,
weight=5, radius = ~sqrt(profit)*2000, color= "#F6BE00",
group = "profit", popup = ~htmlEscape(profit),
popupOptions = popupOptions(maxWidth ="100%", closeOnClick = TRUE))
#addCircles(lat = ~state.latitude, lng = ~state.longitude,
#weight=1, radius = ~sqrt(profit)*2000, color= "#F6BE00",group = "profit")%>%
#addLayersControl(overlayGroups = c("sales","profit"),
#options = layersControlOptions(collapsed = T), position="topleft")
```